package com.java.inner_class;

/**
 * 内部类
 */
public class Main {
    public static void main(String[] args) {
        // 静态内部类：Outer.Inner oi = new Outer().Inner()
        OuterClass.InnerStatic innerStatic = new OuterClass.InnerStatic();
        // System.out.println(innerStatic.privateName);
        System.out.println(innerStatic.publicName); // 静态内部类公共成员
        System.out.println(innerStatic.staticName); // 静态内部类静态成员
        System.out.println(OuterClass.InnerStatic.staticName); // 静态内部类静态成员
        innerStatic.func();
        
        // 成员内部类：Outer.Inner oi = new Outer().new Inner()
        OuterClass.InnerMember innerMember = new OuterClass().new InnerMember();
        // System.out.println(innerMember.privateName);
        System.out.println(innerMember.publicName); // 成员内部类公共成员
        innerMember.func();
        
        // 局部内部类：外部类不能访问局部内部类，只能调用方法在方法内部访问局部内部类
        OuterClass outerClass = new OuterClass();
        outerClass.func();
        
        // 匿名内部类：定义格式为`new 类名(){ 重写的方法 }`，可定义于成员或局部位置，适用于某个类需要被继承或实现且只需要被使用一次的场景。匿名内部类可理解为只需要使用一次的子类或实现类
        Interface innerAnonymous = new Interface() {
            @Override
            public void func1() {
                System.out.println("方法1");
            }
            
            @Override
            public void func2() {
                System.out.println("方法2");
            }
            
            @Override
            public void func3() {
                System.out.println("方法3");
            }
        };
        innerAnonymous.func1(); // 方法1
        innerAnonymous.func2(); // 方法2
        innerAnonymous.func3(); // 方法3
    }
}
